package com.estore.service;

import com.estore.model.Product;
import java.io.*;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;

public class ProductService {
    private Map<String, Product> productData;
    private static final String DATA_FILE = "products.dat";

    public ProductService() {
        productData = new HashMap<>();
        // 最先调用 loadData() 尝试加载数据
        if (!loadData()) {
            // 如果加载失败，初始化默认数据
            System.out.println("未找到数据文件，初始化默认数据...");
            initDefaultData();
        }
    }

    /**
     * 保存数据到文件
     */
    public void saveData() {
        try (ObjectOutputStream oos = new ObjectOutputStream(
                new FileOutputStream(DATA_FILE))) {

            oos.writeObject(productData);
            System.out.println("商品数据已保存到文件: " + DATA_FILE);
            System.out.println("保存的商品数量: " + productData.size());

        } catch (IOException e) {
            System.err.println("保存数据失败: " + e.getMessage());
        }
    }

    /**
     * 从文件加载数据
     * @return 是否成功加载
     */
    @SuppressWarnings("unchecked")
    public boolean loadData() {
        File file = new File(DATA_FILE);
        if (!file.exists()) {
            System.out.println("数据文件不存在，将使用默认数据");
            return false;
        }

        try (ObjectInputStream ois = new ObjectInputStream(
                new FileInputStream(DATA_FILE))) {

            productData = (Map<String, Product>) ois.readObject();
            System.out.println("从文件加载商品数据成功!");
            System.out.println("加载的商品数量: " + productData.size());
            return true;

        } catch (IOException | ClassNotFoundException e) {
            System.err.println("加载数据失败: " + e.getMessage());
            return false;
        }
    }

    /**
     * 初始化默认数据（仅在第一次运行时使用）
     */
    private void initDefaultData() {
        // 为 Java 书籍添加标签
        Set<String> tagsForJavaBook = new HashSet<>();
        tagsForJavaBook.add("编程");
        tagsForJavaBook.add("畅销");
        tagsForJavaBook.add("热门");

        productData.put("p001", new Product("p001", "Java核心技术", 99.0, 100, tagsForJavaBook));

        // 为 Python 书籍添加标签
        Set<String> tagsForPythonBook = new HashSet<>();
        tagsForPythonBook.add("编程");
        tagsForPythonBook.add("入门");
        tagsForPythonBook.add("人工智能");

        productData.put("p002", new Product("p002", "Python编程入门", 79.0, 80, tagsForPythonBook));

        // 为手机添加标签
        Set<String> tagsForPhone = new HashSet<>();
        tagsForPhone.add("电子产品");
        tagsForPhone.add("热门");
        tagsForPhone.add("新品");

        productData.put("p003", new Product("p003", "智能手机", 2999.0, 50, tagsForPhone));

        // 不添加标签的商品
        productData.put("p004", new Product("p004", "普通笔记本", 15.0, 200));
        productData.put("p005", new Product("p005", "文具套装", 25.0, 150));

        System.out.println("默认数据初始化完成，商品数量: " + productData.size());
    }

    public Product getProductById(String id) {
        return productData.get(id);
    }

    public Map<String, Product> getAllProducts() {
        return productData;
    }

    /**
     * 添加新商品（测试数据修改）
     */
    public void addProduct(Product product) {
        productData.put(product.getId(), product);
        System.out.println("添加商品成功: " + product.getName());
    }

    /**
     * 更新商品库存
     */
    public void updateProductStock(String productId, int newStock) {
        Product product = productData.get(productId);
        if (product != null) {
            product.setStock(newStock);
            System.out.println("更新商品库存成功: " + product.getName() + " -> " + newStock);
        }
    }

    // 显示所有商品信息
    public void displayAllProducts() {
        System.out.println("\n=== 所有商品信息 ===");
        System.out.println("商品总数: " + productData.size());
        System.out.println("----------------------------------------");

        for (Product product : productData.values()) {
            System.out.println(product);
        }
        System.out.println("----------------------------------------");
    }
}